package com.aboat.licenseVerify;

import sun.misc.BASE64Encoder;

import java.io.*;
import java.security.MessageDigest;
import java.util.Scanner;

/**
 * 获取电脑相关信息工具
 */
public class cpInfo {
    /**
     * 获取cpu序列号
     * @return
     * @throws IOException
     */
    public static String getCPU() throws IOException {
        Process process = Runtime.getRuntime().exec(new String[] { "wmic", "cpu", "get", "ProcessorId" });
        process.getOutputStream().close();
        Scanner sc = new Scanner(process.getInputStream());
        String property = sc.next();
        String serial = sc.next();
        return serial;
    }


    /**
     * 获取硬盘序列号
     * @param drive 盘符
     * @return
     */
    public static String getSerialNumber(String drive) throws Exception{
        String result = "";
        File file = File.createTempFile("realhowto",".vbs");
        file.deleteOnExit();
        FileWriter fw = new FileWriter(file);
        String vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n"
                +"Set colDrives = objFSO.Drives\n"
                +"Set objDrive = colDrives.item(\"" + drive + "\")\n"
                +"Wscript.Echo objDrive.SerialNumber";  // see note
        fw.write(vbs);
        fw.close();
        Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
        BufferedReader input =
                new BufferedReader
                        (new InputStreamReader(p.getInputStream()));
        String line;
        while ((line = input.readLine()) != null) {
            result += line;
        }
        input.close();
        return result.trim();
    }

    /**
     * 获取主板序列号
     * @return
     */
    public static String getMotherboardSN() throws Exception{
        String result = "";

        File file = File.createTempFile("realhowto", ".vbs");
        file.deleteOnExit();
        FileWriter fw = new FileWriter(file);
        String vbs = "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
                + "Set colItems = objWMIService.ExecQuery _ \n"
                + "   (\"Select * from Win32_BaseBoard\") \n"
                + "For Each objItem in colItems \n"
                + "    Wscript.Echo objItem.SerialNumber \n"
                + "    exit for  ' do the first cpu only! \n" + "Next \n";
        fw.write(vbs);
        fw.close();
        Process p = Runtime.getRuntime().exec(
                "cscript //NoLogo " + file.getPath());
        BufferedReader input = new BufferedReader(new InputStreamReader(p
                .getInputStream()));
        String line;
        while ((line = input.readLine()) != null) {
            result += line;
        }
        input.close();

        return result.trim();
    }

    public static String getFeature() throws Exception{
        String info = cpInfo.getCPU()+cpInfo.getMotherboardSN();
        MessageDigest md5=MessageDigest.getInstance("MD5");
        BASE64Encoder base64en = new BASE64Encoder();
        String localMd5Info=base64en.encode(md5.digest(info.getBytes("utf-8")));
        return localMd5Info;
    }

    public static boolean verifyCpInfo(String md5Info) throws Exception{
        if(md5Info.equals(getFeature())){
            return true;
        }else{
            return false;
        }
    }
}
